package com.tzxs.pay.util;

import com.tzxs.pay.AppAuthTokenGettingReply;
import com.tzxs.pay.PayingWithFaceReply;
import com.tzxs.pay.main.bill.detail.model.BankRefundBean;
import com.tzxs.pay.main.bill.detail.model.CancelAutBean;
import com.tzxs.pay.main.bill.detail.model.MsgRefundBean;
import com.tzxs.pay.main.bill.detail.model.RefundBean;
import com.tzxs.pay.main.bill.detail.model.VerifyOrderBean;
import com.tzxs.pay.main.bill.model.AutBeanDetail;
import com.tzxs.pay.main.bill.model.AutOrderBean;
import com.tzxs.pay.main.bill.model.CoInDetailBean;
import com.tzxs.pay.main.bill.model.CollectionBillEntity;
import com.tzxs.pay.main.bill.model.GtBean;
import com.tzxs.pay.main.deposit.model.SettlementBean;
import com.tzxs.pay.main.first.model.MsgNoticeBean;
import com.tzxs.pay.main.first.model.PendingOrderBean;
import com.tzxs.pay.main.gather.model.BankBackBean;
import com.tzxs.pay.main.gather.model.BankBean;
import com.tzxs.pay.main.gather.model.ScanAutBean;
import com.tzxs.pay.main.gather.model.ScanPayBean;
import com.tzxs.pay.main.installment.model.InstallBean;
import com.tzxs.pay.main.login.model.LoginBean;
import com.tzxs.pay.main.login.model.User;
import com.tzxs.pay.main.mine.model.MessageBean;
import com.tzxs.pay.main.mine.model.PasswordBean;
import com.tzxs.pay.main.mine.model.UpdateApp;
import com.tzxs.pay.main.onlineaut.model.OnlineAutBean;
import com.tzxs.pay.main.onlineaut.model.OnlineAutPrint;
import com.tzxs.pay.main.onlineaut.model.OnlineAutSureInBean;
import com.tzxs.pay.main.onlineaut.model.OnlineDetailBean;
import com.tzxs.pay.main.onlineaut.model.ReSendMsgBean;
import com.tzxs.pay.main.print.model.AllPrintBean;
import com.tzxs.pay.main.print.model.UnsetPrintBean;
import com.tzxs.pay.util.websocket.model.WebSocketBean;

import java.util.Map;

import io.reactivex.Observable;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;

/**
 * 网络请求接口
 */
public interface ApiService {
//    String baseUrl = "http://pay.tiaze.com/api/";//测试地址
    //    String baseUrl = "http://online02.tiaze.com/api/";//测试地址2
    String baseUrl = "http://online01.tiaze.com/api/";//灰度
    //String baseUrl = "https://isv.tiaze.com/api/";//正式地址
    String instructions = "https://isv.tiaze.com/";//正式地址

    String main = "online02.tiaze.com";//正式域名  即时通讯
    String mainlogin = "https://online02.tiaze.com";//正式域名  即时通讯


    /**
     * 登录
     *
     * @param phone    用户名
     * @param password 密码
     * @return Observable
     */
    @FormUrlEncoded
    @POST("merchant/login")
    Observable<LoginBean> login(@Field("phone") String phone, @Field("password") String password);

    /**
     * 获取用户信息
     *
     * @param token token
     * @return Observable
     */

    @FormUrlEncoded
    @POST("merchant/me")
    Observable<User> getUserInfo(@Field("token") String token);

    /**
     * 获取收款账单列表  收款账单包含分期账单
     *
     * @param token token
     * @return Observable
     */
    @GET("merchant/Order")
    Observable<CollectionBillEntity> getCollBillList(@Query("token") String token,
                                                     @Query("type") String type,
                                                     @Query("pay_type") String pay_type,
                                                     @Query("page") int page,
                                                     @Query("number") int number,
                                                     @Query("out_trade_no") String out_trade_no,
                                                     @Query("trade_no") String trade_no,
                                                     @Query("time_start") String time_start,
                                                     @Query("time_end") String time_end);

    /**
     * 获取收款账单列表  收款账单包含分期账单
     *
     * @param token token
     * @return Observable
     */
    @GET("merchant/Order")
    Observable<CollectionBillEntity> getFirstPageStatistical(@Query("token") String token,
                                                             @Query("time_type") int type);


    /**
     * 获取收款账单详情
     *
     * @param token token
     * @return Observable
     */
    @GET("merchant/TradeQuery")
    Observable<CoInDetailBean> getCollBillDeail(@Query("token") String token, @Query("out_trade_no") String tradNum);


    /**
     * 检测app版本
     *
     * @param system 系统Android
     * @return return
     */
    @FormUrlEncoded
    @POST("merchant/upver")
    Observable<UpdateApp> updateApp(@Field("system") String system);

    /**
     * 查询获取押金订单列表  和预授权列表公用一个接口
     */
    @FormUrlEncoded
    @POST("merchant/FundAuthLists")
    Observable<AutOrderBean> getDepositBills(@Field("token") String token,
                                             @Field("type") String type,
                                             @Field("page") int page,
                                             @Field("number") int number,
                                             @Field("out_order_no") String out_order_no,
                                             @Field("remarks") String remarks,
                                             @Field("time_start") String time_start,
                                             @Field("time_end") String time_end,
                                             @Field("pay_status") int pay_status,
                                             @Field("type_time") String type_time);

    /**
     * 获取搜索收款  分期账单列表
     *
     * @param token token
     * @return Observable
     */
    @GET("merchant/Order")
    Observable<CollectionBillEntity> getSearchCollAndInstallList(@Query("token") String token,
                                                                 @Query("type") String type,
                                                                 @Query("pay_type") String pay_type,
                                                                 @Query("page") int page,
                                                                 @Query("number") int number,
                                                                 @Query("remark") String remark,
                                                                 @Query("time_type") int time_type,
                                                                 @Query("out_trade_no") String out_trade_no,
                                                                 @Query("time_start") String time_start,
                                                                 @Query("time_end") String time_end);

    /**
     * 花呗分期
     *
     * @param token      token
     * @param code       支付宝扫码返回码
     * @param amount     金额
     * @param installNum 分期数
     * @param money      商家承担手续费传入100，用户承担手续费传入0
     * @return Response
     */
    @FormUrlEncoded
    @POST("merchant/AlipayHbfqPays")
    Observable<InstallBean> scanInstall(@Field("token") String token,
                                        @Field("code") String code,
                                        @Field("total_amount") String amount,
                                        @Field("hb_fq_num") int installNum,
                                        @Field("hb_fq_seller_percent") int money);

    /**
     * 支付宝 微信 银行卡预授权结算
     *
     * @param token   token
     * @param auth_no 授权号
     * @param pay_num 消费金额
     * @param remarks 备注
     * @return return
     */
    @FormUrlEncoded
    @POST("merchant/FundAuthTradePays")
    Observable<SettlementBean> normalSettlement(@Field("token") String token,
                                                @Field("auth_no") String auth_no,
                                                @Field("pay_num") String pay_num,
                                                @Field("remarks") String remarks);

    /**
     * 扫码预授权
     *
     * @param token   token
     * @param remarks 备注
     * @param code    付款码
     * @param price   金额
     * @return return
     */
    @FormUrlEncoded
    @POST("merchant/FundAuthTradePayCodeType")
    Observable<ScanAutBean> scanAutPay(@Field("token") String token,
                                       @Field("remarks") String remarks,
                                       @Field("code") String code,
                                       @Field("price") String price);

    /**
     * 扫码收款（普通收款）
     *
     * @param token        token
     * @param remarks      备注
     * @param code         二维码扫描结果码
     * @param total_amount 金额
     * @param desc         描述
     * @return return
     */
    @FormUrlEncoded
    @POST("merchant/TradePay")
    Observable<ScanPayBean> scanPay(@Field("token") String token,
                                    @Field("remark") String remarks,
                                    @Field("code") String code,
                                    @Field("total_amount") String total_amount,
                                    @Field("desc") String desc);

    /**
     * 创建银行卡相关订单
     *
     * @param token    token
     * @param amount   金额
     * @param pay_type 支付类型(pay普通,auth预授权)
     * @param remark   备注信息(pat_type=auth时必填)
     * @param authtype 预授权结算时为1
     * @param orderid  订单号(authtype=1时必填)
     * @return
     */

    @FormUrlEncoded
    @POST("merchant/BankOrderCreate")
    Observable<BankBean> creatBankOrder(@Field("token") String token,
                                        @Field("amount") double amount,
                                        @Field("pay_type") String pay_type,
                                        @Field("remark") String remark,
                                        @Field("authtype") int authtype,
                                        @Field("orderid") String orderid,
                                        @FieldMap Map<String, String> map);

    /**
     * 上传银行卡交易回调相关
     *
     * @param token token
     * @param data
     * @return
     */
    @FormUrlEncoded
    @POST("merchant/BankOrderPay")
    Observable<BankBackBean> uploadBankInfo(@Field("token") String token,
                                            @Field("data") String data);


    /**
     * 支付宝或微信预授权撤销
     *
     * @param token   token
     * @param auth_no 授权号
     * @return
     */
    @FormUrlEncoded
    @POST("merchant/FundAuthOrderUnfreeze")
    Observable<CancelAutBean> cancelAut(@Field("token") String token,
                                        @Field("auth_no") String auth_no,
                                        @Field("paystr") String payPassword,
                                        @Field("remarks") String remark);


    /**
     * 银行卡预授权撤销
     *
     * @param token   token
     * @param orderid 订单id
     * @return
     */
    @FormUrlEncoded
    @POST("merchant/BankFundAuthOrderUnfreeze")
    Observable<BankBean> cancleBankAut(@Field("token") String token,
                                       @Field("orderid") String orderid,
                                       @FieldMap Map<String, String> map);


    /**
     * 获取预授权订单详情
     *
     * @param token   token
     * @param orderId 订单号
     * @return 返回
     */
    @FormUrlEncoded
    @POST("merchant/FundAuthOrderDetailQuery")
    Observable<AutBeanDetail> getAutDetail(@Field("token") String token,
                                           @Field("out_order_no") String orderId);

    /**
     * 修改支付密码
     *
     * @param token        token
     * @param newPassword  新密码
     * @param surePassword 确认密码
     * @param phone        手机号
     * @param code         验证码
     * @return 返回
     */
    @FormUrlEncoded
    @POST("merchant/updatePayPassword")
    Observable<PasswordBean> changePassword(@Field("token") String token,
                                            @Field("pay_password") String newPassword,
                                            @Field("pay_password_confirmation") String surePassword,
                                            @Field("phone") String phone,
                                            @Field("code") String code);


    /**
     * 获取短息验证码
     *
     * @param phone 手机号
     * @return 返回
     */
    @FormUrlEncoded
    @POST("Sms/NewSmsSend")
    Observable<MessageBean> getVerCode(@Field("phone") String phone);


    /**
     * 退款
     *
     * @param token       token
     * @param orderId     订单号
     * @param bz          备注
     * @param payPassword 支付密码
     * @param amount      押金
     * @return 返回
     */
    @FormUrlEncoded
    @POST("merchant/PayRefund")
    Observable<RefundBean> refund(@Field("token") String token,
                                  @Field("out_trade_no") String orderId,
                                  @Field("bz") String bz,
                                  @Field("paypwd") String payPassword,
                                  @Field("amount") String amount);


    /**
     * 创建在线预授权订单
     *
     * @param token        token
     * @param prince       金额
     * @param bookingName  入住人
     * @param bookingPhone 入住人手机
     * @param receivePhone 短信接收手机
     * @param bookingTime  入住时间
     * @param remarks      备注
     * @return 返回
     */
    @FormUrlEncoded
    @POST("merchant/SmsFundAuthCreate")
    Observable<ReSendMsgBean> createMsgAutOrder(@Field("token") String token,
                                                @Field("price") float prince,
                                                @Field("BookingName") String bookingName,
                                                @Field("BookingPhone") String bookingPhone,
                                                @Field("ReceivePhone") String receivePhone,
                                                @Field("BookingTime") String bookingTime,
                                                @Field("remarks") String remarks);

    /**
     * 在线预授权列表
     *
     * @param token token
     * @param page  页码
     * @param num   条数
     * @return return
     */
    @FormUrlEncoded
    @POST("merchant/SmsFundAuthList")
    Observable<OnlineAutBean> onlineAutList(@Field("token") String token,
                                            @Field("page") int page,
                                            @Field("number") int num);


    /**
     * 返回在线预授权item详情
     *
     * @param token token
     * @return item 详情
     */
    @FormUrlEncoded
    @POST("merchant/SmsFundAuthDetail")
    Observable<OnlineDetailBean> onlineAutDetail(@Field("token") String token,
                                                 @Field("out_order_no") String orderId,
                                                 @Field("print_status") String print_status);

    /**
     * 返回在线预授权item详情
     *
     * @param token token
     * @return item 详情
     */
    @FormUrlEncoded
    @POST("merchant/SmsFundAuthDetail")
    Observable<OnlineAutPrint> onlineAutPrint(@Field("token") String token,
                                              @Field("out_order_no") String orderId,
                                              @Field("print_status") String print_status);


    /**
     * 短信预授权重新发送短信
     *
     * @param token   token
     * @param orderId 订单号
     * @return return
     */
    @FormUrlEncoded
    @POST("merchant/SmsFundAuthOrderAfreshSend")
    Observable<ReSendMsgBean> resendMsg(@Field("token") String token,
                                        @Field("out_order_no") String orderId);

    /**
     * 短信在线预授权核销
     *
     * @param token   token
     * @param orderId 订单号
     * @return return
     */

    @FormUrlEncoded
    @POST("merchant/SmsFundAuthOrderVerify")
    Observable<OnlineAutSureInBean> orderCancel(@Field("token") String token,
                                                @Field("out_order_no") String orderId);

    //查询在线预授权接口
    @FormUrlEncoded
    @POST("merchant/SmsFundAuthFind")
    Observable<OnlineAutBean> searchAutsList(@Field("token") String token,
                                             @Field("traceNo") String traceNo,
                                             @Field("out_order_no") String orderId,
                                             @Field("BookingName") String bookingName,
                                             @Field("BookingPhone") String bookingPhone,
                                             @Field("ReceivePhone") String ReceivePhone,
                                             @Field("start_time") String startTime,
                                             @Field("end_time") String endTime);


    //交易账单打印汇总
    @FormUrlEncoded
    @POST("merchant/Print_Orderlist")
    Observable<AllPrintBean> printAll(@Field("token") String token,
                                      @Field("time_type") int time_type,
                                      @Field("time_start") String time_start,
                                      @Field("time_end") String time_end);

    //打印未结算的东西
    @FormUrlEncoded
    @POST("merchant/UnsettlementOrderlist")
    Observable<UnsetPrintBean> unsetPrint(@Field("token") String token,
                                          @Field("time_type") int time_type,
                                          @Field("time_start") String time_start,
                                          @Field("time_end") String time_end,
                                          @Field("print_kind1") String print_kind1,
                                          @Field("print_kind2") String print_kind2);

    //个推推送
    @FormUrlEncoded
    @POST("merchant/singleSendNotification")
    Observable<GtBean> startGt(@Field("token") String token,
                               @Field("cids") String cids,
                               @Field("set_title") String set_title,
                               @Field("set_text") String set_text);

    //退款时间超过一个小时  进行短信验证码退款
    @FormUrlEncoded
    @POST("merchant/apiPayRefundVerify")
    Observable<MsgRefundBean> startMsgRefund(@Field("token") String token,
                                             @Field("paypwd") String paypwd,
                                             @Field("verifystr") String verifystr,
                                             @Field("out_trade_no") String orderId,
                                             @Field("bz") String bz);


    //验证订单是否超过退款期限
    @FormUrlEncoded
    @POST("merchant/apiIsOut")
    Observable<VerifyOrderBean> verifyOrder(@Field("token") String token,
                                            @Field("out_order_no") String orderId);

    //websocket即时通讯
    @FormUrlEncoded
    @POST("WorkPost")
    Observable<WebSocketBean> loginWebSocket(@Field("type") String type,
                                             @Field("login_type") String login_type,
                                             @Field("client_id") String client_id,
                                             @Field("user_phone") String phone);


    //通知列表
    @FormUrlEncoded
    @POST("merchant/getArticleNoticeList")
    Observable<MsgNoticeBean> noticeList(@Field("token") String token,
                                         @Field("offset") int offset,
                                         @Field("limit") int limit);

    //通知详情
    @FormUrlEncoded
    @POST("merchant/orderExpired")
    Observable<PendingOrderBean> noticeDetail(@Field("token") String token,
                                              @Field("offset") int offset,
                                              @Field("limit") int limit);

    //通知详情
    @FormUrlEncoded
    @POST("merchant/BankOrderRefundCreate")
    Observable<BankRefundBean> bankRefund(@Field("token") String token,
                                          @Field("amount") float amount,
                                          @Field("paystr") String payPassword,
                                          @Field("remark") String remark,
                                          @Field("orderid") String orderid,
                                          @FieldMap Map<String, String> map);

    @FormUrlEncoded
    @POST("merchant/getSmileAuthToken")
    Call<AppAuthTokenGettingReply> getAppAuthToken(@Field("token") String token);

    @FormUrlEncoded
    @POST("merchant/SmilePay")
    Call<PayingWithFaceReply> payWithFace(@Field("token") String token, @Field("ftoken") String ftoken,
                                          @Field("amount") String amount, @Field("remark") String remarks);
}